home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / Pdev.man < prev    next >
Text File  |  1990-06-27  |  21KB  |  491 lines

  1. ' $Header: /sprite/src/lib/c/etc/RCS/Pdev.man,v 1.5 90/03/30 15:47:27 douglis Exp $ SPRITE (Berkeley)
  2. .so \*(]ltmac.sprite
  3. .HS Pdev lib
  4. .BS
  5. .SH NAME
  6. Pdev_Open, Pdev_Close, Pdev_SetDefaultHandler, Pdev_SetStreamHandler, Pdev_EnumStreams \- Package for servicing pseudo-devices.
  7. .SH SYNOPSIS
  8. \fB#include <pdev.h>\fR
  9. .sp
  10. Pdev_Token
  11. .br
  12. \fBPdev_Open\fR(\fIname, realNamePtr, reqBufSize, readBufSize, service, clientData\fR)
  13. .br
  14. void
  15. .br
  16. \fBPdev_Close\fR(\fIpdevToken\fR)
  17. .br
  18. int
  19. .br
  20. \fBPdev_GetStreamID\fR(\fIpdevToken\fR)
  21. .br
  22. int (*
  23. .br
  24. \fBPdev_SetDefaultHandler\fR(\fIpdevToken, operation, handler\fR))()
  25. .br
  26. int (*
  27. .br
  28. \fBPdev_SetStreamHandler\fR(\fIstreamPtr, operation, handler\fR))()
  29. .br
  30. int
  31. .br
  32. \fBPdev_EnumStreams\fR(\fIpdevToken, func, clientData\fR)
  33. .SH ARGUMENTS
  34. .AS Pdev_CallBacks readBufSize
  35. .AP char *name in
  36. Name of file to use for pseudo-device.
  37. .AP char **realNamePtr out
  38. Where to store pointer to actual pseudo-device file name, or NULL
  39. if \fIname\fR is to be the complete name of pseudo-device file.
  40. .AP int reqBufSize in
  41. The preferred size for request buffers.
  42. .AP int readBufSize in
  43. The size for a read buffer.  Zero means no read buffering.
  44. .AP Pdev_CallBacks *service in
  45. A set of service call-back procedures.
  46. .AP ClientData clientData in
  47. Private user-defined data field.
  48. .AP Pdev_Token pdevToken in
  49. Token for the pseudo-device returned from \fBPdev_Open\fP.
  50. .AP Pdev_Stream *streamPtr in
  51. Handle for a stream to the pseudo-device.
  52. .AP int operation in
  53. \fBPDEV_OPEN\fP, \fBPDEV_CLOSE\fR, \fBPDEV_READ\fR, \fBPDEV_WRITE\fR,
  54. \fBPDEV_IOCTL\fR, \fBPDEV_SET_ATTR\fR, \fBPDEV_GET_ATTR\fR.
  55. .AP int (*handler)() in
  56. Service call-back procedure.
  57. .AP int (*func)() in
  58. A procedure applied to each stream to the pseudo-device.
  59. .BE
  60. .SH Pdev_Open
  61. .LP
  62. \fBPdev_Open\fR creates a pseudo-device
  63. and installs a set of service procedures for it.
  64. The pseudo-device can subsequently be opened by any number of
  65. regular (client) processes,
  66. and the service call-backs are made each time a client process makes
  67. a file system operation on the pseudo-device.
  68. Thus the service call-backs implement the standard file system
  69. operations for the pseudo-device while the Pdev package
  70. manages the interface between the kernel and the server process.
  71. .LP
  72. There are two ways that \fBPdev_Open\fR can pick the name of the file to
  73. use for the pseudo-device.  If \fIrealNamePtr\fR is NULL, then
  74. \fBPdev_Open\fR uses \fIname\fR as the name.  If \fIrealNamePtr\fR isn't
  75. NULL, then \fBPdev_Open\fR will generate a file name of the form
  76. \fIhostDir\fB/\fInameXX\fR, where \fIhostDir\fR is the name of
  77. a standard host-specific directory, \fIname\fR
  78. is the parameter to this procedure, and \fIXX\fR is a decimal number
  79. generated by \fBPdev_Open\fR.  \fBPdev_Open\fR tries numbers up from 1 until it finds
  80. one that works.  The name of the successful pseudo-device file is
  81. returned by storing a pointer to it at \fI*realNamePtr\fR;  the
  82. storage for the name is dynamically allocated with \fBmalloc\fR and
  83. must eventually be freed by the caller.
  84. .PP
  85. \fBPdev_Open\fR returns an opaque token that
  86. is used in calls to \fBPdev_Close\fP, \fBPdev_SetDefaultHandler\fP,
  87. and \fBPdev_EnumStreams\fP.
  88. If a pseudo-device couldn't be opened, then NULL is
  89. returned and \fBpdev_ErrorMsg\fR contains a string
  90. describing the problem.
  91. .PP
  92. After a successful \fBPdev_Open\fP call the Pdev package will set up a
  93. \fIservice stream\fP whenever a client process
  94. opens the pseudo-device.  Each service stream is identified
  95. to the call-backs by a \fBPdev_Stream\fP record.
  96. Thus the pseudo-device can be multiplexed over several clients
  97. with each client's request comming over a different service stream.
  98. However, forks and dups are not visible to the pseudo-device server,
  99. so more than one process might be using any particular service stream.
  100. .PP
  101. The \fIreqBufSize\fP is used to configure a request buffer associated
  102. with each service stream.  This size determines how many request messages
  103. can be buffered before the kernel is forced to wait for them to be
  104. serviced.  More than one request may be outstanding due to asynchronous writes,
  105. which are described below.
  106. A minimum size on the request buffer is enforced by the library,
  107. so zero can be passed in to get a default size (about 1 Kbyte). 
  108. .PP
  109. The \fIreadBufSize\fP is used to configure an optional read buffer associated
  110. with each service stream.  If this size is non-zero it indicates that
  111. a read buffer will be used to satisfy client read requests instead
  112. of using the read service call-back.
  113. In this case the Pdev package will allocate
  114. a read buffer each time a service stream is created and pass the address
  115. of this buffer to the open call-back.  After that it is up to the 
  116. server process to manage the read buffer.  See the device man page
  117. for \fBpdev\fP for details.
  118. .PP
  119. The \fIclientData\fP parameter to \fBPdev_Open\fP
  120. is passed to the open call-back as
  121. described below.  It is meant to be used as a pointer back to
  122. some top-level state of the pseudo-device.
  123. .LP
  124. The Pdev package uses the facilities of \fBFs_Dispatch\fR in order to keep
  125. track of the streams associated with the pseudo-device and ensure
  126. that Pdev is notified whenever those streams become readable.  In order
  127. to use Pdev, you must also use \fBFs_Dispatch\fR.
  128. .SH Pdev_Close
  129. .LP
  130. \fBPdev_Close\fR shuts down a pseudo-device, closing all the streams
  131. associated with it and releasing any resources allocated to the
  132. pseudo-device.  As a side-effect the close call-back is made to
  133. any existing service streams.  After this procedure returns, \fIpdevToken\fR
  134. should never be used again.
  135. .SH Pdev_GetStreamID
  136. .LP
  137. \fBPdev_GetStreamID\fR  returns the identifier for the stream
  138. associated with the token returned by \fBPdev_Open\fP.  This may be
  139. used for stream-oriented calls such as \fBfstat\fP but should not be
  140. used as the argument to \fBclose\fP (\fBPdev_Close\fP should be used
  141. instead.) 
  142. .SH "Pdev_EnumStreams"
  143. .PP
  144. The \fBPdev_EnumStreams\fP procedure is used to apply a function
  145. to all the service streams to the pseudo-device.  This
  146. enumeration procedure eliminates the need to keep track of
  147. each service stream.
  148. The \fIfunc\fP argument is called on each service stream as follows:
  149. .DS
  150. int
  151. (*func)(streamPtr, clientData)
  152.     Pdev_Stream *streamPtr;
  153.     ClientData clientData;
  154.  
  155. .DE
  156. Where \fIstreamPtr\fP identifies the service stream,
  157. and \fIclientData\fP is what was passed to \fBPdev_EnumStreams\fP.
  158. \fIfunc\fP should return zero to mean success,
  159. or a non-zero error status.  In the case of an error
  160. \fBPdev_EnumStreams\fP stops its enumeration and returns the non-zero status.
  161. .SH "Pdev_SetDefaultHandler"
  162. .LP
  163. \fBPdev_SetDefaultHandler\fP is used to set the call-back for individual
  164. pdev operations.
  165. It is not normally needed as you can define all
  166. the call-backs with \fBPdev_Open\fP (or \fBPfs_OpenConnection\fP).
  167. The call-backs passed to \fBPdev_Open\fP are inherited by
  168. each service stream that is created.  Changing a call-back
  169. with \fBPdev_SetDefaultHandler\fP changes the call-back for
  170. all subsequently created service streams.  It doesn't affect any
  171. service streams that are already established.
  172. This returns the old default call-back.
  173. .SH Pdev_SetStreamHandler
  174. .PP
  175. \fBPdev_SetStreamHandler\fP is used to set a call-back for an
  176. already existing service stream.
  177. It returns the old call-back.
  178. .SH "SERVICE PROCEDURES"
  179. .ta 1.5i 3.0i 3.5i
  180. .PP
  181. The call-back service procedures are given to \fBPdev_Open\fP
  182. (and \fBPfs_OpenConnection\fP) as a record
  183. of procedures:
  184. .DS
  185. typedef struct {
  186.     int (*open)();    /* PDEV_OPEN */
  187.     int (*read)();    /* PDEV_READ */
  188.     int (*write)();    /* PDEV_WRITE and PDEV_WRITE_ASYNC */
  189.     int (*ioctl)();    /* PDEV_IOCTL */
  190.     int (*close)();    /* PDEV_CLOSE */
  191.     int (*getAttr)();    /* PDEV_GET_ATTR */
  192.     int (*setAttr)();    /* PDEV_SET_ATTR */
  193. } Pdev_CallBacks;
  194. .DE
  195. .PP
  196. Any of the record elements can
  197. be NULL to indicate that the operation should be handled by
  198. a default handler.
  199. The \fIservice\fP parameter
  200. itself can also be NULL to indicate default
  201. handling for all operations.  This is only useful during initial test.
  202. If a client makes an operation for which no service procedure is provided
  203. it is simply a no-op; it is not an error.
  204. The global variable \fBpdev_Trace\fP can be set to a non-zero value
  205. to generate printfs to stderr when
  206. each service procedure (default or user-supplied) is invoked.
  207. .LP
  208. Service procedures should return zero to mean successful completion,
  209. otherwise they should return an appropriate errno value.
  210. Additionally, the \fBread\fP and \fBwrite\fP procedures
  211. use \fBEWOULDBLOCK\fR to indicate incomplete operations.
  212. This is described further below.
  213. .LP
  214. Each service procedure also sets the current select state bits for
  215. the pseudo-device.
  216. The select bits are used in the kernel's implementation
  217. of \fBselect\fR for pseudo-devices.  They should be a bitwise or
  218. combination of \fBFS_READABLE\fR, \fBFS_WRITABLE\fR, and \fBFS_EXCEPTION\fR.
  219. As well as setting this select state after each client operation,
  220. it may be set asynchronously with the \fBIOC_PDEV_READY\fP
  221. \fBioctl\fR command on the service stream.
  222. .PP
  223. These same service procedures are used for
  224. pseudo-device connections into the pseudo-file-system.
  225. See \fBPfs_Open\fP and \fBPfs_OpenConnection\fP.
  226. The \fBgetAttr\fP and \fBsetAttr\fP call-backs are only made to
  227. pseudo-file-system servers.
  228. For regular pseudo-devices the kernel takes care of all attribute handling.
  229. .SH open
  230. .ta 0.5i 3.0i 3.5i
  231. .DS
  232. int
  233. (*service->open)(clientData, streamPtr, readBuffer, flags, procID,
  234.     hostID, uid, selectBitsPtr)
  235.     ClientData clientData;    /* Private data passed to Pdev_Open */
  236.     Pdev_Stream *streamPtr;    /* Identifies stream to pseudo-device. */
  237.     char *readBuffer;    /* Storage for optional read buffer */
  238.     int flags;    /* Flags to the open system call. NOTE!
  239.          * These are Sprite flags defined in <fs.h>,
  240.          * not the Unix flags defined in <sys/file.h> */
  241.     int procID;    /* ID of process opening the pseudo-device */
  242.     int hostID;    /* Host where that process is executing */
  243.     int uid;    /* User ID of that process */
  244.     int *selectBitsPtr;    /* Return - the initial select state of the process */
  245. .DE
  246. .LP
  247. When a client process makes an \fBopen\fP system call on the pseudo-device
  248. the Pdev library package invokes the \fBopen\fP service call-back to
  249. give the server a chance to refuse or
  250. accept the open by the client process.  The return value of the
  251. open call-back is either 0 for success, or an appropriate errno value.
  252. .PP
  253. The \fBopen\fR call-back gets passed the \fIclientData\fP that was given
  254. to the \fBPdev_Open\fP procedure,
  255. and a new \fIstreamPtr\fP that is a handle on the service stream
  256. corresponding to the open by the client.
  257. \fIstreamPtr\fP is a pointer to a \fBPdev_Stream\fP
  258. record that contains a \fBclientData\fP field for use by the call-backs,
  259. and a \fBstreamID\fP field that is used in \fBioctl\fP calls
  260. on the service stream.
  261. The possible \fBioctl\fP calls are listed at the end of this man page.
  262. The \fIstreamPtr\fP gets passed to all the other call-backs,
  263. and is also passed to \fBPdev_SetStreamHandler\fP.
  264. .PP
  265. The parameters also include the
  266. useFlags passed to the \fBFs_Open\fP system call, and the user ID
  267. and Sprite hostID of the client process.
  268. (\fBFs_Open\fR is the Sprite version of \fBopen\fR.  The
  269. flag bits are different and are defined in <fs.h>.  Flags passed
  270. to \fBopen\fP are mapped to the Sprite flag bits you'll get here.)
  271. If the \fIreadBufSize\fP parameter to \fBPdev_Open\fP was non-zero then
  272. Pdev allocates \fIreadBuffer\fP and passes it to the open call-back.
  273. Thus there will be one read buffer for each service stream
  274. if the server is implementing read buffering.
  275. .SH close
  276. .ta 0.5i 3.0i 3.5i
  277. .DS
  278. int
  279. (*service->close)(streamPtr)
  280.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  281. .DE
  282. .LP
  283. This is called when a service stream is closed.
  284. This happens either as a side effect of \fBPdev_Close\fP,
  285. or when the client has closed is last reference to the service stream.
  286. (Dups and forks are not visible to the pseudo-device server,
  287. so there is only one close per open system call by a client process.)
  288. .SH read
  289. .ta 0.5i 3.0i 3.5i
  290. .DS
  291. int
  292. (*service->read)(streamPtr, readPtr, freeItPtr, selectBitsPtr, sigPtr)
  293.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  294.     Pdev_RWParam *readPtr;    /* Read parameter block */
  295.     Boolean *freeItPtr;    /* Set to TRUE if buffer should be free'd */
  296.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  297.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  298. .DE
  299. .LP
  300. The read service procedure is passed a record of type \fBPdev_RWParam\fP
  301. that indicates the \fBlength\fP, \fBoffset\fP, and \fBbuffer\fP
  302. for the read.
  303. The buffer is pre-allocated by the \fBPdev\fP library.
  304. If the read service procedure wants to use a different buffer
  305. it can change \fIreadPtr\fB->buffer\fR to reference its own storage.
  306. If this different storage area ought to be freed after
  307. the library completes the operation,
  308. then *\fIfreeItPtr\fR should be set to a non-zero value.
  309. .PP
  310. The \fIreadPtr\fB->length\fR record field indicates how much data is requested,
  311. and it should be updated to reflect the amount of data actually returned.
  312. If there is no data available on the pseudo-device then the
  313. read call-back should return \fBEWOULDBLOCK\fR
  314. and set \fIreadPtr\fB->length\fR to zero.
  315. This causes the kernel to block the client process until the select
  316. state of the pseudo-device is changed to indicate readability.
  317. If there are some bytes available the return value should be zero
  318. and \fIreadPtr\fB->length\fR set appropriately.
  319. If the read leaves no additional bytes available
  320. then the \fBFS_READABLE\fP bit can be cleared from *\fIselectBitsPtr\fP
  321. in order to block the next read request.
  322. End-of-file is indicated to the client by a zero return code and
  323. a zero number of bytes returned.
  324. .PP
  325. A signal can be generated in response to a read request by
  326. setting \fIsigPtr\fB->signal\fR to a non-zero value.
  327. \fIsigPtr\fB->code\fR can also be set to modify the signal meaning.
  328. Data can be returned if a signal is generated.
  329. The client application's system call will complete,
  330. its signal handler, if any, will be invoked,
  331. and the system call will be retried.
  332. .PP
  333. Note:  If there is a read buffer associated with the service stream,
  334. which is indicated by a non-zero valued \fIreadBufSize\fP
  335. parameter to \fBPdev_Open\fP,
  336. then this read call-back is never called.
  337. Instead the kernel takes data directly
  338. from the read buffer.  The protocol for adding data to the read buffer is
  339. described in the \fBpdev\fR device man page.
  340. .SH write
  341. .ta 0.5i 3.0i 3.5i
  342. .DS
  343. int
  344. (*service->write)(streamPtr, async, writePtr, selectBitsPtr, sigPtr)
  345.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  346.     int async;    /* TRUE during an asynchronous write */
  347.     Pdev_RWParam *writePtr;    /* Write parameter block */
  348.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  349.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  350. .DE
  351. .LP
  352. The write service procedure is passed a parameter block that
  353. indicates the \fBlength\fP, \fBoffset\fP, and \fBbuffer\fP
  354. for the operation, plus various IDs of the application process.
  355. If \fIasync\fP is \fBFALSE\fP (zero)
  356. then \fIwritePtr\fB->length\fR should be
  357. updated to reflect how much data was processed by the service procedure.
  358. If \fIasync\fP is non-zero it indicates an asynchronous write and the service
  359. procedure must accept all of the data and the
  360. return value of \fIwritePtr\fB->length\fR is ignored.
  361. .PP
  362. If the server cannot accept all of the data it must return \fBEWOULDBLOCK\fR
  363. \fIand\fP update \fIwritePtr\fB->length\fR to indicate just how much data
  364. it accepted.  This return value causes the kernel to block the client
  365. process until the select state of the pseudo-device is changed
  366. to indicate writability.
  367. To repeat, returning a short write count and a zero return code will cause the
  368. kernel to immediately issue another write request to complete
  369. the client's write operation.
  370. By also returning \fBEWOULDBLOCK\fR the pseudo-device server forces the
  371. client process to wait until the pseudo-device becomes writable.
  372. .LP
  373. A signal to the client application can be generated as a side effect
  374. by setting \fIsigPtr\fB->signal\fR to a non-zero value.
  375. \fIsigPtr\fB->code\fR can be set to modify the signal.
  376. Data can be accepted by the write service procedure if a signal is generated.
  377. The client application's write call will complete,
  378. its signal handler, if any, will be invoked,
  379. and the write call will be retried.
  380. .SH ioctl
  381. .ta 0.5i 3.0i 3.5i
  382. .DS
  383. int
  384. (*service->ioctl)(streamPtr, ioctlPtr, selectBitsPtr, sigPtr)
  385.     Pdev_Stream *streamPtr;    /* Set by open service procedure */
  386.     Pdev_IOCParam *ioctlPtr;    /* I/O Control parameter block */
  387.     int *selectBitsPtr;    /* Return - select state of pdev */
  388.     Pdev_Signal *sigPtr;    /* Return - signal to generate, if any */
  389. .DE
  390. .LP
  391. The ioctl service procedure takes a parameter block that specifies
  392. the \fBcommand\fP, and two buffers,
  393. one containing input data (\fBinBuffer\fP),
  394. and one for data returned to the client (\fBoutBuffer\fP).
  395. The ioctl service has to set \fIioctlPtr\fB->outBufSize\fR to indicate how much
  396. data is being returned to the client process.
  397. The \fBPdev_IOCParam\fP struct also contains various processIDs,
  398. and the \fBformat\fP of the host on which the client
  399. application is executing.
  400. .LP
  401. The pseudo-device server can implement any \fIioctlPtr\fB->command\fR it wants.
  402. Generic commands are defined in <fs.h>, and other ranges of commands
  403. for particular devices and pseudo-devices are defined in header
  404. files in /sprite/src/lib/include/dev.
  405. .LP
  406. The input and output data is not byteswapped by the operating system.
  407. It is the server's responsibility to fix up the input and output
  408. buffers in the case that the client has a different byte order.
  409. The local byte order is defined as \fBMACH_BYTE_ORDER\fR by <machparam.h>,
  410. and the client's byte order and alignment are
  411. indicated by \fIioctlPtr\fB->format\fR.
  412. The \fBFmt_Convert\fR library routine can be used to
  413. swap and align incomming and outgoing buffers.
  414. .LP
  415. A signal to the client application can be generated as a side effect
  416. by setting \fIsigPtr\fB->signal\fR to a non-zero value.
  417. \fIsigPtr\fB->code\fR can be set to modify the signal.
  418. .SH getAttr
  419. .ta 0.5i 3.0i 3.5i
  420. .DS
  421. int
  422. GetAttrProc(streamPtr, attrPtr, selectBitsPtr)
  423.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  424.     Fs_Attributes *attrPtr;    /* Return - attributes */
  425.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  426. .DE
  427. .LP
  428. This procedure is called to handle an fstat() call on a file
  429. in a pseudo-file system.  The \fIstreamPtr\fP parameter identifies the
  430. open stream, and the server should fill in the attributes.
  431. This call-back is not made to regular pseudo-device servers,
  432. only to pseudo-file-system servers.
  433. .SH setAttr
  434. .ta 3.0i 3.5i
  435. .DS
  436. int
  437. SetAttrProc(streamPtr, flags, uid, gid, attrPtr, selectBitsPtr)
  438.     Pdev_Stream *streamPtr;    /* Identifies service stream */
  439.     int flags;    /* Indicate what attributes to set */
  440.     int uid;    /* Identifies user making the call */
  441.     int gid;    /* Identifies group of process */
  442.     Fs_Attributes *attrPtr;    /* Attributes to set as indicated by flags */
  443.     int *selectBitsPtr;    /* Return - select state of the pseudo-device */
  444. .DE
  445. .LP
  446. This procedure is called to set certain attributes of
  447. an open file in a pseudo-file system.  The \fIstreamPtr\fP
  448. parameter identifies the open stream.
  449. The flags argument contains an or'd combinantion of
  450. \fBFS_SET_TIMES\fR, \fBFS_SET_MODE\fR, \fBFS_SET_OWNER\fR,
  451. \fBFS_SET_FILE_TYPE\fR, \fBFS_SET_DEVICE\fR
  452. that indicate what attributes to set.  The attribute values are contained
  453. in \fI*attrPtr\fR.  The \fIuid\fR and \fIgid\fR arguments
  454. identify the calling process.
  455. This call-back is not made to regular pseudo-device servers,
  456. only to pseudo-file-system servers.
  457. .SH Service Stream Ioctls
  458. .ta 1.0i
  459. .PP
  460. The pseudo-device server can make a few \fBFs_IOControl\fP calls on
  461. its service streams.  The details of the calling sequences is described
  462. in the device man page for pseduo-devices (pdev).  The possible
  463. operations are:
  464. .IP IOC_PDEV_READY
  465. Used to change the select state of the pseudo-device.  The input buffer
  466. to Fs_IOControl should contain an or'd combination of
  467. \fBFS_READABLE\fR, \fBFS_WRITABLE\fR, or \fBFS_EXCEPTION\fR.
  468. .IP IOC_PDEV_SIGNAL_OWNER
  469. Used to send a signal to the owning process or process group of the
  470. pseudo-device.  This is useful for implementing interrupt characters
  471. in tty emulators.  No special permission is needed.
  472. .IP IOC_PDEV_WRITE_BEHIND
  473. Used to set or unset asynchronous writing.
  474. .IP IOC_PDEV_BIG_WRITES
  475. Used to allow or disallow writes larger than the request buffer.
  476. .IP IOC_PDEV_SET_PTRS
  477. Used to adjust pointers into the read buffer and the request buffer.
  478. Users of the Pdev package should only use this to adjust
  479. read buffer pointers.  Leave the request buffer pointers equal to -1
  480. so you don't mess up the managing of the request buffer.
  481. .PP
  482. For example:
  483. .DS
  484. status = Fs_IOControl(streamPtr->streamID, IOC_PDEV_READY,
  485.         sizeof(int), &selectBits, 0, NULL);
  486. .DE
  487. .SH SEE ALSO
  488. pdev (devices), Pfs, Swap_Buffer
  489. .SH KEYWORDS
  490. pseudo-device
  491.